// 是否会栈溢出
// 栈溢出的原因是比如在一个函数里边无限的调用自身，就容易导致栈溢出
// 因为每一次的函数调用都会在执行栈中添加一个执行上下文，占用栈的内存空间，这个上下文需要到
// 函数执行结束之后才会弹出。所以在函数内部调用自身，这个函数没有执行完毕就再添加了一个执行上下文
// 无限的添加下去，就导致栈溢出
// function foo() {
//   // 不会栈溢出 因为 setTimeout是异步函数，整个foo函数执行完毕之后，将其执行上下文弹出，
//   // 随后在去任务队列中取出foo 继续执行，
//   setTimeout(foo, 0);
// }

// function foo() {
//   // 会栈溢出。因为这里会先执行foo()函数，然后才将其结果存入到任务队列中，
//   // 所以导致前一个foo函数的执行上下文没有弹出，有继续存储，从而导致栈溢出
//   setTimeout(foo(), 0);
// }

// function foo() {
//   // 不会栈溢出
//   Promise.resolve().then(foo);
// }

function foo() {
  // 也不会
  requestAnimationFrame(foo);
}